问题:有三个柱子放在左中右三个位置,左边柱子上有n个碟子(都不一样大)从上到下按从小到大的顺序叠起来放置,最底下是第n个碟子,最大。现要将n个碟子从左边柱子移动到右边柱子。要求:每次只能移动一个碟子;大碟子不能压在小碟子上;只能往相邻的柱子移动。求移动碟子的最少次数,并输出移动次数最少时的每个移动过程。
递归版本
n个碟子的问题可以这么考虑:先将n-1个碟子从左柱子依次移动到中间、右边的柱子,然后将最底下的碟子移到中间,再将n-1个碟子移动回左边,第n个碟子移到右边。如此一来,规模为n的问题就变成了n-1规模的问题,可以采用递归进行求解。
#include<string>
#include<iostream>
using std::string;
using std::cout;
using std::endl;
//用于打印每个移动步骤,num为碟子序号,origin为移动前所在的柱子,dest为移动后所在的柱子
void printStep(int num, string origin, string dest) {
cout << "Move " << num << " from " << origin << " to " << dest << endl;
}
printStep用于打印每个移动步骤,注意由于移动只能发生在相邻的柱子之间,此函数的发出地,终点也应该是相邻的